﻿/*************************************
 * Creator:peiyang
 * DateTime:2021/3/18 8:22:11
 * Description:<Description>
 * CopyRight:臭皮匠工作室
 * ***********************************/

using Cpjit.SunnyPaine.Toolkit.ActiveMQ.Enums;
using Cpjit.SunnyPaine.Toolkit.ActiveMQ.Model;
using System;
using System.Collections.Generic;
using System.Text;

namespace Cpjit.SunnyPaine.Toolkit.ActiveMQ
{
    /// <summary>
    /// 提供ActiveMQ客户端工具的接口。
    /// </summary>
    public interface IActivemqClient : IDisposable
    {
        #region 属性定义
        /// <summary>
        /// ActiveMQ代理服务的地址（必填项）。
        /// </summary>
        string BrokerUri { get; set; }

        /// <summary>
        /// ActiveMQ代理服务的地址（仅包含IP地址。）
        /// </summary>
        string BrokerUriIpAddress { get; }

        /// <summary>
        /// 用户名。
        /// </summary>
        string UserName { get; set; }

        /// <summary>
        /// 密码。
        /// </summary>
        string Password { get; set; }

        /// <summary>
        /// 客户端Id名称。
        /// </summary>
        string ClientId { get; set; }

        /// <summary>
        /// 发送消息持久化的有效时长。
        /// </summary>
        TimeSpan LiveTime { get; set; }

        /// <summary>
        /// 是否连接到ActiveMQ。
        /// </summary>
        bool IsConnected { get; }

        /// <summary>
        /// 字符编码。默认UTF8。
        /// </summary>
        Encoding Encoding { get; set; }
        #endregion


        #region 委托定义
        /// <summary>
        /// 当与服务端连接状态变化时发生。
        /// </summary>
        event Action<IActivemqClient, StatusEventArgs> ConnectionStatusChanged;

        /// <summary>
        /// 当出现错误时发生。
        /// </summary>
        event Action<IActivemqClient, ExceptionEventArgs> Error;
        #endregion


        #region 方法定义
        /// <summary>
        /// 连接ActiveMQ服务。
        /// </summary>
        /// <returns></returns>
        bool Connect();

        /// <summary>
        /// 异步连接ActiveMQ服务。不可等待。
        /// </summary>
        /// <returns></returns>
        void AsyncConnect();

        /// <summary>
        /// 异步连接ActiveMQ服务并自动调用消费者注册，如果传入 null，则调用 RegisterConsumer()，如果传入具体参数，则调用 RegisterConsumer(IEnumerable&lt;string&gt; dlls)。不可等待。
        /// </summary>
        void AsyncConnect(IEnumerable<string> dlls);

        /// <summary>
        /// 断开并释放与ActiveMQ服务的连接。
        /// </summary>
        void Close();

        /// <summary>
        /// 注册消费者。
        /// </summary>
        void RegisterConsumer();

        /// <summary>
        /// 注册消费者。
        /// </summary>
        /// <param name="dlls">要扫描的目标dll完整路径。</param>
        void RegisterConsumer(IEnumerable<string> dlls);

        /// <summary>
        /// 注册消费者。
        /// </summary>
        /// <param name="consumer"></param>
        /// <returns></returns>
        bool RegisterConsumer(IConsumer consumer);

        /// <summary>
        /// 订阅消息。
        /// </summary>
        /// <param name="destinationType">目标类型。</param>
        /// <param name="destinationName">目标名称。</param>
        /// <param name="handler">回调的目标方法。</param>
        void SubscribeDestination(DestType destinationType, string destinationName, Action<IActivemqClient, DataEventArgs> handler);

        /// <summary>
        /// 订阅消息。
        /// </summary>
        /// <param name="destinationType">目标类型。</param>
        /// <param name="destinationName">目标名称。</param>
        /// <param name="ignoreExpiration">是否忽视过期。</param>
        /// <param name="handler">回调的目标方法。</param>
        void SubscribeDestination(DestType destinationType, string destinationName, bool ignoreExpiration, Action<IActivemqClient, DataEventArgs> handler);

        /// <summary>
        /// 取消订阅。
        /// </summary>
        /// <param name="destinationType">目标类型。</param>
        /// <param name="destinationName">目标名称。</param>
        void CancelSubscribeDestination(DestType destinationType, string destinationName);

        /// <summary>
        /// 发送文本消息。
        /// </summary>
        /// <param name="content">消息内容。</param>
        /// <param name="destinationType">目标类型。</param>
        /// <param name="destinationName">目标名称。</param>
        void Send(string content, DestType destinationType, string destinationName);

        /// <summary>
        /// 发送文本消息。
        /// </summary>
        /// <param name="content">消息内容。</param>
        /// <param name="destinationType">目标类型。</param>
        /// <param name="destinationName">目标名称。</param>
        /// <param name="isPersistent">消息是否持久化。</param>
        void Send(string content, DestType destinationType, string destinationName, bool isPersistent);

        /// <summary>
        /// 发送文本消息。
        /// </summary>
        /// <param name="content">消息内容。</param>
        /// <param name="destinationType">目标类型。</param>
        /// <param name="destinationName">目标名称。</param>
        /// <param name="isPersistent">消息是否持久化。</param>
        /// <param name="msgProperties">消息附加属性。</param>
        void Send(string content, DestType destinationType, string destinationName, bool isPersistent, IDictionary<string, string> msgProperties);

        /// <summary>
        /// 发送字节数组消息。
        /// </summary>
        /// <param name="bytes">消息内容。</param>
        /// <param name="destinationType">目标类型。</param>
        /// <param name="destinationName">目标名称。</param>
        void Send(byte[] bytes, DestType destinationType, string destinationName);

        /// <summary>
        /// 发送字节数组消息。
        /// </summary>
        /// <param name="bytes">消息内容。</param>
        /// <param name="destinationType">目标类型。</param>
        /// <param name="destinationName">目标名称。</param>
        /// <param name="isPersistent">消息是否持久化。</param>
        void Send(byte[] bytes, DestType destinationType, string destinationName, bool isPersistent);

        /// <summary>
        /// 发送字节数组消息。
        /// </summary>
        /// <param name="bytes">消息内容。</param>
        /// <param name="destinationType">目标类型。</param>
        /// <param name="destinationName">目标名称。</param>
        /// <param name="isPersistent">消息是否持久化。</param>
        /// <param name="msgProperties">消息附加属性。</param>
        void Send(byte[] bytes, DestType destinationType, string destinationName, bool isPersistent, IDictionary<string, string> msgProperties);
        #endregion
    }
}
